home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 6 / QRZ Ham Radio Callsign Database - Volume 6.iso / mac / files / amiga / csrc720j.lzh / term.c < prev    next >
C/C++ Source or Header  |  1993-01-11  |  6KB  |  268 lines

  1. /* term.c */
  2.      
  3. /**********************************************************************
  4.  * Terminal I/O for the CBBS program.
  5.  *
  6.  * Pete VE5VA
  7.  **********************************************************************/
  8. #include <exec/types.h>
  9. #include <exec/exec.h>
  10. #include <intuition/intuition.h>
  11. #include <intuition/intuitionbase.h>
  12. #include <stdio.h>
  13. #include <ctype.h>
  14. #include "amiga.h"
  15. #define INTUITION_REV 1L
  16.      
  17.      
  18. struct IntuitionBase *IntuitionBase = 0L;
  19. struct IntuiMessage *NewMessage = 0L;
  20. extern char tmpstr[];     
  21. extern char optflags[];     
  22. extern int debug;
  23. long readbit,windbit,keybit;
  24. struct TextAttr TextFont = {
  25.    (UBYTE *)"topaz.font",
  26.    8,0,0
  27. };
  28.      
  29. struct IOStdReq *Con_Read = 0L,*Con_Write = 0L;
  30.      
  31.      
  32. /* my window structure */
  33. struct NewWindow NewWindow = {
  34.    0,
  35.    0,
  36.    640,
  37.    256,
  38.    0,
  39.    1,
  40.  
  41.    /* IDCMPFlags */
  42.    0L
  43.    | IDCMP_MOUSEBUTTONS
  44.    | IDCMP_CLOSEWINDOW
  45.    ,
  46.  
  47.    /* Flags */  
  48.    0L
  49.    | WFLG_ACTIVATE
  50.    | WFLG_BORDERLESS
  51.    | WFLG_DEPTHGADGET
  52. /*   | WFLG_SIZEGADGET  */
  53. /*   | WFLG_DRAGBAR    */
  54.    | WFLG_CLOSEGADGET
  55.    | WFLG_SMART_REFRESH
  56.    | WFLG_RMBTRAP
  57.    ,
  58.  
  59.    NULL,
  60.    NULL,
  61.    NULL,
  62.    NULL,
  63.    NULL,
  64.    350,50,
  65.    640,256,
  66.    WBENCHSCREEN
  67. };
  68.      
  69.      
  70. struct Window *mywindow = 0L;             /* ptr to applications window */
  71. struct RastPort *rp;
  72. struct ViewPort *vp;
  73. short mouse = 0;               /* If mouse set then open mouse too */
  74. struct MsgPort *crp,*cwp;
  75.      
  76. unsigned char ichar;
  77. #define NEW      1006L
  78. #define AMG_MAXBUF   1024
  79. static unsigned char scrn_tmp[AMG_MAXBUF+1];
  80. static long      scrn_tmp_p = 0L;
  81. short od = 0;     /* device is open so it can be closed */
  82. openterm()
  83. {
  84.    long i;
  85.      
  86.    short id;
  87.    register unsigned short *p,*q;
  88.    register int j,k;
  89.    IntuitionBase = (struct IntuitionBase *)
  90.                     OpenLibrary((UBYTE *)"intuition.library", INTUITION_REV);
  91.    if( IntuitionBase == NULL ) {
  92.       puts("can't open intuition\n");
  93.       return(1);
  94.    }
  95.    if(optflags[3] == 0) {
  96.       /* Option to add window border and allow resizing of the window
  97.       */
  98.       NewWindow.Flags &= ~WFLG_BORDERLESS;
  99.       NewWindow.Flags |= (WFLG_SIZEGADGET | WFLG_DRAGBAR);
  100.    }
  101.    if(optflags[5] == 0) {
  102.       /* Option to remove the title bar etc. */
  103.       NewWindow.IDCMPFlags &= ~IDCMP_CLOSEWINDOW;
  104.       NewWindow.Flags &= ~ (WFLG_DEPTHGADGET | WFLG_CLOSEGADGET);
  105.    }
  106.    /* Start by trying to open a full-size European window.
  107.       If that fails, try the North American one.
  108.    */
  109.    if(( mywindow = OpenWindow(&NewWindow) ) == NULL) {
  110.       NewWindow.Height = 200;
  111.       if(( mywindow = OpenWindow(&NewWindow) ) == NULL) {
  112.          printf("cant open window\n");
  113.          return(1);
  114.       }
  115.    }
  116.    rp = mywindow->RPort;
  117.    vp = &mywindow->WScreen->ViewPort;
  118.    crp = CreatePort(0L,0L);
  119.    if(crp == 0L) {
  120.       printf("can't create console read port\n");
  121.       closeterm();
  122.       return(1);
  123.    }
  124.    cwp = CreatePort(0L,0L);
  125.    if(cwp == 0L) {
  126.       printf("can't create console write port\n");
  127.       closeterm();
  128.       return(1);
  129.    }
  130.    Con_Read = CreateStdIO(crp);
  131.    if(Con_Read == 0L) {
  132.       printf("can't create stdio read port\n");
  133.       closeterm();
  134.       return(1);
  135.    }
  136.    Con_Write = CreateStdIO(cwp);
  137.    if(Con_Write == 0L) {
  138.       printf("can't create stdio write port\n");
  139.       closeterm();
  140.       return(1);
  141.    }
  142.      
  143.    Con_Read->io_Data = (APTR)mywindow;
  144.    Con_Read->io_Length = (long)sizeof(*mywindow);
  145.    if(OpenDevice((UBYTE *)"console.device",0L,
  146.                               (struct IORequest *)Con_Read,0L)) {
  147.       i = IoErr();
  148.       printf("OpenDevice failed %ld\n",i);
  149.       closeterm();
  150.       return(1);
  151.    }
  152.    Con_Write->io_Device = Con_Read->io_Device;
  153.    Con_Write->io_Unit = Con_Read->io_Unit;
  154.    od = 1;
  155.  
  156.    windbit = (1L << mywindow->UserPort->mp_SigBit);
  157.  
  158.    keybit  = (1L << crp->mp_SigBit);
  159.    Con_Read->io_Data = (APTR)&ichar;
  160.    Con_Read->io_Command = CMD_READ;
  161.    Con_Read->io_Length = 1;
  162.    SendIO((struct IORequest *)Con_Read);
  163.    cursor_off();
  164.    window_title(0,0);
  165.    return(0);
  166. }
  167.      
  168. closeterm()
  169. {
  170.    if(od)CloseDevice((struct IORequest *)Con_Read);
  171.    if(Con_Read)DeleteStdIO(Con_Read);
  172.    if(crp)DeletePort(crp);
  173.    if(Con_Write)DeleteStdIO(Con_Write);
  174.    if(cwp)DeletePort(cwp);
  175.    if(mywindow)CloseWindow(mywindow);
  176.    if(IntuitionBase)CloseLibrary((struct Library *)IntuitionBase);
  177.    od = 0;
  178.    Con_Read = Con_Write = (struct IOStdReq *) 0L;
  179.    crp = cwp = (struct MsgPort *) 0L;
  180.    mywindow = 0;
  181.    IntuitionBase = 0;
  182.    windbit = keybit = 0L;
  183. }
  184.      
  185.      
  186. ttputc(c)
  187. unsigned char c;
  188. {
  189.    if(c > 0177)return;
  190.    if(c == 7) {   /* beep char ... sound the beep and let it flash screen */
  191.       beep();
  192.    }
  193.    /* Remove a return char. The original IBM code outchar()
  194.       will not send us a return char anyway but some of my stuff might.
  195.    */
  196.    if(c == '\r')return;
  197.    /* Don't permit Control-N */
  198.    if(c != ('N' - 0100))
  199.       scrn_tmp[scrn_tmp_p++] = c;
  200.    ttflush();
  201.      
  202. }
  203. ttputs(s)
  204. unsigned char   *s;
  205. {
  206.    if(od == 0)return;
  207.    while (*s) {
  208.       if(*s > 0177) {
  209.          s++;
  210.          continue;
  211.       }
  212.       if(*s == 7) {   /* beep char */
  213.          beep();
  214.       }
  215.       /* Remove a return char. The original IBM code
  216.          outstr() will not send us a return char anyway but some of
  217.          my stuff might.
  218.       */
  219.       if(*s == '\r') continue;
  220.       /* Don't permit Control-N */
  221.       if(*s != ('N' - 0100))
  222.          scrn_tmp[scrn_tmp_p++] = *s++;
  223.    }
  224.    ttflush();
  225. }
  226.      
  227. ttflush()
  228. {
  229.    if(od == 0)return;
  230.    if(scrn_tmp_p) {
  231.       Con_Write->io_Data = (APTR) scrn_tmp;
  232.       Con_Write->io_Length = scrn_tmp_p;
  233.       Con_Write->io_Command = CMD_WRITE;
  234.       DoIO((struct IORequest *)Con_Write);
  235.    }
  236.    scrn_tmp_p = 0;
  237. }
  238. cleanup()
  239. {
  240.    cleanser();
  241.    closeterm();
  242. }
  243. cursor_off()
  244. {
  245.    ttputs("\033[\060\040p");
  246. }
  247. cursor_on()
  248. {
  249.    ttputs("\033[\040p");
  250. }
  251. /* Change the window dimensions BEFORE opening it */
  252. setwindow(l,t,w,h)
  253. short l,t,w,h;
  254. {
  255.    NewWindow.LeftEdge = l;
  256.    NewWindow.TopEdge  = t;
  257.    NewWindow.Width    = w;
  258.    NewWindow.Height   = h;
  259. }
  260. /* This is only in here to save version.c having to #include lots of
  261.    files that make it slow to compile
  262. */
  263. setwtitles(s)
  264. char *s;
  265. {
  266.    SetWindowTitles(mywindow,(UBYTE *)s,(UBYTE *)-1L);
  267. }
  268.